/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle;

import entidades.Administrador;
import entidades.Perfil;
import entidades.Usuario;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import persistencia.RepositorioJPAUsuarios;

/**
 *
 * @author Gleydson
 */
@ManagedBean(name = "SistemaBean")
@SessionScoped
public class SistemaBean {

    private Perfil perfilLogado;
    private List<Perfil> listaPerfis;
    private Usuario usuarioLogado;
    private String usuario = "";
    private String senha = "";
    private RepositorioJPAUsuarios repositorioUsuarios;

    public SistemaBean() {
        repositorioUsuarios = new RepositorioJPAUsuarios();
        criaPerfis();
    }

    private void criaPerfis() {
        Perfil perfil;

        //Cria perfil administrador
        setListaPerfis(new ArrayList<Perfil>());
        perfil = new Perfil();
        perfil.setCadastro(true);
        perfil.setConsulta(true);
        perfil.setManutencao(true);


        //Cadastros
        perfil.setPerfil("Administrador");
        perfil.setCadUsuarios(true);
        perfil.setCadTipoequipamento(true);
        perfil.setCadReservalaboratorios(true);
        perfil.setCadReservaequipamentos(true);
        perfil.setCadLaboratorios(true);
        perfil.setCadLaboratorios(true);
        perfil.setCadEquipamentos(true);
        perfil.setCadEmprestimolaboratorios(true);
        perfil.setCadEmprestimoequipamentos(true);
        perfil.setCadDevolucaolaboratorios(true);
        perfil.setCadDevolucaoequipamentos(true);
        perfil.setCadCadraques(true);
        //Consultas

        perfil.setConsEquipamentos(true);
        perfil.setConsQuadroraques(true);
        perfil.setConsReservaequipamentos(true);
        perfil.setConsReservalaboratorios(true);
        //manutencao
        perfil.setManBackup(true);
        listaPerfis.add(perfil);


        //cria perfil monitor

        perfil = new Perfil();

        perfil.setCadastro(false);
        perfil.setConsulta(true);
        perfil.setManutencao(false);
        //Cadastros
        perfil.setPerfil("Monitor");
        perfil.setCadUsuarios(false);
        perfil.setCadTipoequipamento(true);
        perfil.setCadReservalaboratorios(false);
        perfil.setCadReservaequipamentos(false);
        perfil.setCadLaboratorios(false);
        perfil.setCadLaboratorios(false);
        perfil.setCadEquipamentos(false);
        perfil.setCadEmprestimolaboratorios(false);
        perfil.setCadEmprestimoequipamentos(false);
        perfil.setCadDevolucaolaboratorios(false);
        perfil.setCadDevolucaoequipamentos(false);
        perfil.setCadCadraques(false);
        //Consultas

        perfil.setConsEquipamentos(true);
        perfil.setConsQuadroraques(true);
        perfil.setConsReservaequipamentos(true);
        perfil.setConsReservalaboratorios(true);
        //manutencao
        perfil.setManBackup(false);
        listaPerfis.add(perfil);


        //cria perfil Apoio
        perfil = new Perfil();

        perfil.setCadastro(true);
        perfil.setConsulta(true);
        perfil.setManutencao(false);
        //Cadastros
        perfil.setPerfil("Apoio");
        perfil.setCadUsuarios(false);
        perfil.setCadTipoequipamento(true);
        perfil.setCadReservalaboratorios(true);
        perfil.setCadReservaequipamentos(true);
        perfil.setCadLaboratorios(true);
        perfil.setCadLaboratorios(true);
        perfil.setCadEquipamentos(true);
        perfil.setCadEmprestimolaboratorios(true);
        perfil.setCadEmprestimoequipamentos(true);
        perfil.setCadDevolucaolaboratorios(true);
        perfil.setCadDevolucaoequipamentos(true);
        perfil.setCadCadraques(true);
        //Consultas
        perfil.setConsEquipamentos(true);
        perfil.setConsQuadroraques(true);
        perfil.setConsReservaequipamentos(true);
        perfil.setConsReservalaboratorios(true);
        //manutencao
        perfil.setManBackup(false);
        listaPerfis.add(perfil);


        //cria perfil Professor
        perfil = new Perfil();

        perfil.setCadastro(false);
        perfil.setConsulta(true);
        perfil.setManutencao(false);
        //Cadastros
        perfil.setPerfil("Professor");
        perfil.setCadUsuarios(false);
        perfil.setCadTipoequipamento(false);
        perfil.setCadReservalaboratorios(false);
        perfil.setCadReservaequipamentos(false);
        perfil.setCadLaboratorios(false);
        perfil.setCadLaboratorios(false);
        perfil.setCadEquipamentos(false);
        perfil.setCadEmprestimolaboratorios(false);
        perfil.setCadEmprestimoequipamentos(false);
        perfil.setCadDevolucaolaboratorios(false);
        perfil.setCadDevolucaoequipamentos(false);
        perfil.setCadCadraques(false);
        //Consultas
        perfil.setConsEquipamentos(true);
        perfil.setConsQuadroraques(true);
        perfil.setConsReservaequipamentos(true);
        perfil.setConsReservalaboratorios(true);
        //manutencao
        perfil.setManBackup(false);
        listaPerfis.add(perfil);

    }

    public void logoff() {
        try {
            //Contexto da Aplicação
            FacesContext conext = FacesContext.getCurrentInstance();
            //Verifica a sessao e a grava na variavel
            HttpSession session = (HttpSession) conext.getExternalContext().getSession(false);
            //Fecha/Destroi sessao
            session.invalidate();
            
            FacesContext.getCurrentInstance().getExternalContext().redirect("/login.faces");
            usuarioLogado = null;
            usuario = "";
            senha = "";

            
        } catch (IOException ex) {
            Logger.getLogger(SistemaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void carregaTemplate() {
        if (usuarioLogado == null) {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("/login.faces");
            } catch (IOException ex) {
                Logger.getLogger(SistemaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    
    public void botaoLoginAction() {
        Iterator<Perfil> it = listaPerfis.iterator();
        if (usuario.equals("admin") && senha.equals("admin")) {//lembrar de remover na versao de produçao
            usuarioLogado = new Administrador();
            usuarioLogado.setLogin("admin");

            setPerfilLogado(it.next());

            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("/index.faces");
            } catch (IOException ex) {
                Logger.getLogger(SistemaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {

            usuarioLogado = repositorioUsuarios.buscaUsuario(usuario, senha);
            while (!listaPerfis.contains(perfilLogado)) {
                setPerfilLogado(it.next());
                if (!perfilLogado.getPerfil().equals(usuarioLogado.getDtype())) {
                    setPerfilLogado(null);
                }
            }
            if (usuarioLogado != null) {
                try {
                    FacesContext.getCurrentInstance().getExternalContext().redirect("/index.faces");
                } catch (IOException ex) {
                    Logger.getLogger(SistemaBean.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário ou senha invalidos, tente novamente...", ""));
            }
        }
    }

    /**
     * @return the usuarioLogado
     */
    public Usuario getUsuarioLogado() {
        return usuarioLogado;
    }

    /**
     * @param usuarioLogado the usuarioLogado to set
     */
    public void setUsuarioLogado(Usuario usuarioLogado) {
        this.usuarioLogado = usuarioLogado;
    }

    /**
     * @return the usuario
     */
    public String getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the senha
     */
    public String getSenha() {
        return senha;
    }

    /**
     * @param senha the senha to set
     */
    public void setSenha(String senha) {
        this.senha = senha;
    }

    /**
     * @return the listaPerfis
     */
    public List<Perfil> getListaPerfis() {
        return listaPerfis;
    }

    /**
     * @param listaPerfis the listaPerfis to set
     */
    public void setListaPerfis(List<Perfil> listaPerfis) {
        this.listaPerfis = listaPerfis;
    }

    /**
     * @return the perfilLogado
     */
    public Perfil getPerfilLogado() {
        return perfilLogado;
    }

    /**
     * @param perfilLogado the perfilLogado to set
     */
    public void setPerfilLogado(Perfil perfilLogado) {
        this.perfilLogado = perfilLogado;
    }
}
